//
// Created by LiuYou on 2021/10/24.
//

/*
 使用单一计时器 利用alarm();或者setitimer();实现;, 构造一组函数, 实现任意数量的计时器。
 这个和之前写的令牌桶非常的相似。

 使用 alarm();  函数时, 如果有
 alarm(10);
 alarm(1);
 alarm(5);
 那么只有一个 alarm(); 生效, 那就是 alarm(5); 生效。
 */




#ifndef LINUXENVIRONMENTPROGRAMMING2_ANYTIMER_HPP
#define LINUXENVIRONMENTPROGRAMMING2_ANYTIMER_HPP


#define JOB_MAX     1024


typedef void (* Func)(void*);


/**
 * @brief
 * @param sec
 * @param jobFunc
 * @param args
 * @return
 * <p>         >=  0       成功, 返回任务ID。
 * <p>         ==  -1      失败, 参数非法。
 * <p>         ==  -2      失败, 不能在支持其它任务了, 达到了计时器支持任务的上限。
 * <p>         ==  -3      失败, malloc();调用失败。
 */
extern int addJob(int sec, Func jobFunc, void* args);


/**
 * @brief
 * @param jobId
 * @return
 * <p>      ==  0       成功, 指定任务成功取消。
 * <p>      ==  -1      失败, 传入参数非法。
 * <p>      ==  -2      失败, 指定任务已经完成。
 * <p>      ==  -3      失败, 指定任务重复取消。
 */
extern int cancelJob(int jobId);


/**
 * @brief
 * @param jobId
 * @return
 * <p>      ==  0       成功, 指定任务成功释放。
 * <p>      ==  -1      失败, 传入参数非法。
 */
extern int waitJob(int jobId);


/* ************************************************************ */

extern int pauseJob(int jobId);

extern int resumeJob(int jobId);


#endif //LINUXENVIRONMENTPROGRAMMING2_ANYTIMER_HPP
